package pe.edu.upc.dew.bibliotecaweb.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pe.edu.upc.dew.bibliotecaweb.model.Persona;
import pe.edu.upc.dew.bibliotecaweb.service.PersonaService;

/**
 * @author DEW 2010
 * Acción encargada de realizar las validaciones necesarias para llevar a cabo el proceso de Login
 */
public class LoginAction extends org.apache.struts.action.Action {

    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";
    private PersonaService personaService;

    public LoginAction() {
        this.personaService = new PersonaService();
    }

    /**
     * Contiene la lógica necesaria para realizar la validación de usuario.
     * Si el proceso se lleva a cabo de manera satisfactoria, el redireccionamiento y lógica a ejecutarse es la de SUCCESS.
     * En adición, se sube toda la información del usuario a la sesión.
     * Si el proceso de validación no se da de manera correcta, el redireccionamiento y lógica a ejecutarse es la de FAILURE.
     * En adición, se setea el atributo error del formulario, que será mostrado como mensaje en la página.
     * @param mapping   permite realizar los redireccionamientos, en base a la asociación y configuración hecha en el archivo struts-config.xml.
     * @param form      permite acceder a los campos del formulario de Login.
     * @param request   trae el request generado al realizar el submit desde el formulario de Login.
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // Recupero las variables del JSP
        LoginForm datosForm = (LoginForm) form;
        String username = datosForm.getUsuarioPersona();
        String password = datosForm.getPasswordPersona();
        // Creamos una sesión
        HttpSession session = (HttpSession) request.getSession();
        // Insertamos los atributos obtenidos del formulario en un objeto Persona
        Persona beforeLogin = new Persona();
        beforeLogin.setUsuarioPersona(username);
        beforeLogin.setPasswordPersona(password);
        // Procedemos a validar a la persona
        if (personaService.login(beforeLogin) != null) {
            Persona datosPersona = personaService.login(beforeLogin);
            // Si la validación se realiza correctamente, subimos sus datos a la sesión
            session.setAttribute("persona", datosPersona);
            return mapping.findForward(SUCCESS);
        } else {
            // La validación no fue correcta, redireccionamos a la persona a la página de Login
            datosForm.setError();
            session.setAttribute("failure", datosForm);
            return mapping.findForward(FAILURE);
        }

    }
}
